package com.jeff.android.lab.module.annotation.runtime;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * 拦截本应该回调的方法 onClick ，而去执行我们自定义的方法
 */
public class ListenerInvocationHandler implements InvocationHandler {

    // 拦截目标，比如需要拦截 MainActivity 中的方法
    private Object target;
    // 需要拦截的对象
    private HashMap<String, Method> methodHashMap = new HashMap();

    public ListenerInvocationHandler(Object object) {
        this.target = object;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        if (target != null) {
            // 获取需要拦截的方法名
            String methodName = method.getName(); // 假如是 onClick()
            method = methodHashMap.get(methodName); // 执行自定义方法 show()
            if (method != null) {
                if (args.length == 0) {
                    return method.invoke(target);
                } else {
                    return method.invoke(target, args);
                }
        }
    }
        return null;
    }

    /**
     * 添加要拦截的方法
     *
     * @param methodName 拦截的方法，如 onClick()
     * @param method 执行的方法，如 show()
     */
    public void addMethod(String methodName, Method method) {
        methodHashMap.put(methodName, method);
    }

}
